
/**
   1. 无法 new
   2. 不公开 (对外界不可见)
   3. protected 子类能用
 */

public abstract class AbstractList<E> implements List<E> {
  // 元素的数量
  protected int size;

  // 元素的数量
  public int size() {
    return size;
  }

  public boolean isEmpty() {
    return size == 0;
  }

  // 是否包含某个元素
  public boolean contains(E element) {
    return indexOf(element) != ELEMENT_NOT_FOUND;
  }

  public void add(E element) {
    add(size, element);
  }

  protected void outOfBounds(int index) {
    throw new IndexOutOfBoundsException("index:" + index + ", size:" + size);
  }

  protected void rangeCheck(int index) {
    if (index < 0 || index >= size ) {
      outOfBounds(index);
    }
  }

  protected void rangeCheckForAdd(int index) {
    if (index < 0 || index > size ) {
      outOfBounds(index);
    }
  }
}